//
// Created by sgyt on 2020/2/18.
// 守护进程创建
/**
 * 1.fork创建子进程,保证了子进程的pid和组id不一样,父进程退出，子进程继成进程组id
 * 2.子进程调用setsid改变进程的会话id
 * 3.改变工作目录，保证文件不受外界干扰
 * 4.关闭没有必要的文件描述符，守护进程不受终端控制，关闭0,1,2的文件描述符
 * 5.逻辑操作
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <syslog.h>
#include <sys/resource.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <signal.h>
#include <sys/time.h>
#include <time.h>

void myfun()
{
    int fd;
    openlog("guard_process",LOG_CONS | LOG_PID, LOG_CRON);
    fd = open("process_log",O_RDWR|O_CREAT|O_APPEND,777);
    if(fd < 0){
        exit(0);
    }
    //获取系统时间
    time_t t;
    time(&t);
    char *timestr = ctime(&t);
    //将时间写入文件
    write(fd,timestr, strlen(timestr));
    syslog(LOG_INFO,"guard_process:%s\n",timestr);
    closelog();
    close(fd);

}

int main(int argc,char *argv[])
{
    int pid,res;
    pid = fork();
    if(pid < 0)
    {
        perror("fork is error\n");
    }else if(pid > 0 )
    {
        exit(0);//父进程退出
    }else{
        //保证父进程退出
        sleep(1);
        //设置新的会话ids
        setsid();
        //开始设置文件工作目录
        chdir("/opt/bin");
        umask(0000);
        //关闭用不到的文件描述符
        close(STDIN_FILENO);
        close(STDOUT_FILENO);
        close(STDERR_FILENO);
        //设置信号处理，定时器定时发送信号，信号写入文件中
        struct sigaction act;
        act.sa_flags = 0;
        act.sa_handler = myfun;
        sigemptyset(&act.sa_mask);
        sigaction(SIGALRM,&act,NULL);

        //设定时钟，定时发送
        struct itimerval tm;
        tm.it_interval.tv_sec = 2;
        tm.it_interval.tv_usec = 0;
        tm.it_value.tv_sec = 3;
        tm.it_value.tv_usec = 0;

        setitimer(ITIMER_REAL,&tm,NULL);

        while(1)
        {
            sleep(1);
        }
    }
    return 0;
}




